package ar.com.uade.administradorsiembra.modelo;

import java.util.LinkedList;
import java.util.List;
import ar.com.uade.administradorsiembra.modelo.exceptions.CantidadSembradaInsuficienteParaCosechaException;
import ar.com.uade.administradorsiembra.views.LoteView;
import ar.com.uade.administradorsiembra.views.MineralPorcentajeView;

public abstract class Lote extends Entidad {
	private Integer numeroLote;
	private Cereal ultimoCereal;
	private Float area;
	private Boolean estaSembrado;
	private Boolean estaEliminado;
	private Propietario propietario;
	private Float cantidadSembrada;
	private List<MineralPorcentaje> minerales;

	private void initiLote(){
		this.numeroLote = new Integer(0);
		this.area = new Float(0);
		this.cantidadSembrada = new Float(0);
		this.estaSembrado = new Boolean(false);
		this.estaEliminado = new Boolean(false);
		this.minerales = new LinkedList<MineralPorcentaje>();
	}
	
	public Lote(Integer numeroLote) {
		this.initiLote();
		this.numeroLote = numeroLote;
	}

	public Lote(Integer id, Integer numeroLote) {
		this.initiLote();
		this.id	= id;
		this.numeroLote = numeroLote;
	}
	
	public Integer getId() {
		return this.id;
	}
	
	public void setPropietario(Propietario propietario) {

		this.propietario = propietario;
	}
	
	public Propietario getPropietario() {

		return this.propietario;
	}

	public Integer getNumeroLote() {
		return numeroLote;
	}

	public Cereal getUltimoCereal() {
		return ultimoCereal;
	}

	public void setUltimoCereal(Cereal ultimoCereal) {
		this.ultimoCereal = ultimoCereal;
	}

	public Boolean estaSembrado() {
		if(estaSembrado == null){
			this.estaSembrado = new Boolean(false);
		}
		return estaSembrado;
	}

	public Boolean estaEliminado() {
		if(estaEliminado == null){
			this.estaEliminado = new Boolean(false);
		}
		return estaEliminado;
	}

	public void eliminar() {
		this.estaEliminado = new Boolean(true);
	}

	public void sembrar(Float cantidadSembrada) {
		this.cantidadSembrada = cantidadSembrada;
		this.estaSembrado = new Boolean(true);
	}

	public void cosechar(Float cantidadCosechada) throws CantidadSembradaInsuficienteParaCosechaException {
		if(cantidadCosechada > this.cantidadSembrada){
			throw new CantidadSembradaInsuficienteParaCosechaException();
		}
		this.cantidadSembrada = -cantidadCosechada;
		if (this.cantidadSembrada <= 0) {
			this.estaSembrado = false;
		}
	}

	protected void setArea(float area) {
		this.area = area;
	}
	
	public Float getArea() {
		// TODO Auto-generated method stub
		return this.area;
	}

	public Float getCantidadSembrada() {
		// TODO Auto-generated method stub
		return this.cantidadSembrada;
	}
	
	public List<MineralPorcentaje> getMinerales() {
		return minerales;
	}
	
	public void setMinerales(List<MineralPorcentaje> minerales) {
		this.minerales = minerales;
	}

	public void modificar(Float areaSiembra, Propietario propietario) {
		// TODO Auto-generated method stub
		this.area = areaSiembra;
		
		this.propietario = propietario;
	}
	
	public LoteView getView() {
		// TODO Auto-generated method stub
		LoteView view = new LoteView();
		List<MineralPorcentajeView> mineralesView = new LinkedList<MineralPorcentajeView>();
		
		view.setId(this.getId());
		view.setNumeroLote(this.getNumeroLote());
		view.setArea(this.getArea());
		view.setPropietarioView(this.getPropietario().getView());
		
		for (MineralPorcentaje mineral : this.getMinerales()) {
			mineralesView.add(mineral.getView());
		}
		
		view.setMinerales(mineralesView);
		
		return view;
	}
}
